package puissance4ensi;

class Plateau
{
	private static int _nbColonne = 7;
	private static int _nbLigne = 6;
	private Pion _grille[][];
	
	public Plateau ()
	{
		_grille = new Pion[_nbLigne][_nbColonne];
		for (int i=0;i<_nbLigne;i++)
		{
			for(int j=0;j< _nbColonne;j++)
			{
				_grille[i][j] = new Pion(Couleur.VIDE);
			}
		}
	}

	public static int getNbLigne()
	{
		return _nbLigne;
	}

	public static int getNbColonne()
	{
		return _nbColonne;
	}

	public void setPion(int colonne, Pion pion) throws ExceptionColonnePleine, ExceptionPlateauPlein
	{
		int ligne = _nbLigne-1;
		boolean caseLibre = false;
		while (!caseLibre && ligne >= 0)
		{
			if(_grille[ligne][colonne-1].getCouleur() == Couleur.VIDE)
			{
				//placement du pion
				_grille[ligne][colonne-1] = pion;
				//test de victoire
				
				//test de place sur le plateau
				//A Faire : tester si la méthode de victoire renvoi false
				if(ligne==0)
					if(plateauPlein()) throw new ExceptionPlateauPlein();
				caseLibre = true;	
			}
			ligne--;
		}	
		if(!caseLibre) throw new ExceptionColonnePleine();
	}

	public Pion getPion (int ligne, int colonne)
	{
		return _grille[ligne][colonne];
	}
	
	private boolean plateauPlein(){
		boolean plein = true;
		int cptColonne=0;
		while(plein && cptColonne<_nbColonne){
			plein=(_grille[0][cptColonne].getCouleur()!=Couleur.VIDE);
			cptColonne++;
		}
		return plein;
	}
	//
	public int nbIdentiqueVertical(int ligne, int colonne, Pion pion)
	{
		int cpt = 0;
		// cas de la ligne vertical, impossible d'avoir un pion dessus donc voir dessous
		for(int i = 0; i < _nbLigne; i++)
		{
			if(_grille[i][colonne].getCouleur() == pion.getCouleur())
			{
				cpt++;
			}
		}	
		return (cpt);
	}	
	//
	public int nbIdentiqueHorizontal(int ligne, int colonne, Pion pion)
	{
		boolean erreur = false;
		int cpt = 0, i = colonne, j = colonne;
		// cherche à droite.
		while(i<_nbColonne && !erreur)
		{
			if(_grille[ligne][i].getCouleur() == pion.getCouleur() && erreur == false)
			{
				cpt++;
			}
			else if (_grille[ligne][i].getCouleur() != pion.getCouleur())
			{
				erreur = true;
			}
			i++;
		}
		// cherche à gauche
		if(colonne!=0)
		{ 
			while(j>0 && !erreur)
			{
				if(_grille[ligne][i].getCouleur() == pion.getCouleur() && erreur == false)
				{
					cpt++;
				}
				else if (_grille[ligne][i].getCouleur() != pion.getCouleur())
				{
					erreur = true;
				}
				j--;
			}
		}	
		return (cpt);
	}	

	public boolean verifGagne(int ligne, int colonne, Pion pion)
	{
		int nbOccurence = 0;
		boolean gagne = false;
		nbOccurence = nbIdentiqueHorizontal(ligne,colonne,pion);
		if(nbOccurence >= 4)
		{
			gagne = true;
		} 
		else
		{
			nbOccurence = nbIdentiqueVertical(ligne,colonne,pion);
			if(nbOccurence >= 4)
			{
				gagne = true;
			} 
		}
		return(gagne);
	}  

}